import string
import random

from django.contrib.auth.models import Group
from django.shortcuts import render

# Create your views here.
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.status import HTTP_404_NOT_FOUND, HTTP_201_CREATED
from rest_framework.viewsets import ModelViewSet

from celery_tasks.email.tasks import send_email_task
from utils.permission import TeacherPermission
from .serializers import *
# from .models import *
from rest_framework.permissions import IsAuthenticated

class ClassesViewSet(ModelViewSet):
    queryset = Classes.objects.filter(is_delete=False)  # 接口操作的所有数据
    serializer_class = ClassesSerializer
    permission_classes = [TeacherPermission] #登录后必须满足自定义权限才可以访问视图集API
    # permission_classes  = [IsAuthenticated] 登录才可以进行访问视图集API

    def get_serializer(self, *args, **kwargs):  # 重写get_serializer ，根据不同的操作返回不同的序列化器对象
        if self.action == 'students':#如果不是注册方法 则使用查询序列化器 如果是注册方法则返回的是注册序列化器
            return CreateUserSerializer(*args, **kwargs)
        return self.serializer_class(*args, **kwargs)

    @action(methods=['post'], detail=True)#使用装饰器生成对应的路由地址和方法名一致 methods为提交方式，detail为是否为详情路由
    def students(self, request, pk):#注册方法
        # 获取班级
        try:
            classes = self.get_queryset().get(id=pk)
        except Classes.DoesNotExist:
            return Response(status=HTTP_404_NOT_FOUND)

        # 得到前端传入的数据
        username = request.data['username']
        email = request.data['email']
        first_name = request.data['first_name']

        # 判断该用户是否已经在该班级，查询班级的所有成员，以用户作为条件
        member = classes.member.filter(username=username)  # 查询集为空转bool就是False
        if member:
            # 如果在，则返回，并提示已存在
            return Response({'msg': '该成员已加入该班级'})

        # 如果不在，则判断用户是否存在，判断是否是新学员
        user = User.objects.filter(username=username)
        if user:
            user = user.first()#first方法得到列表对象 列表对象用于添加数据
            # 如果存在，将该用户添加到班级并返回
            classes.member.add(user)
            return Response(self.get_serializer(user).data)#返回对应反序列化器的user data数据

        # 如果不存在，则创建用户
        # 使用序列化器进行反序列化，校验传入进来的数据
        user_serializer = self.get_serializer(data=request.data) #使用的序列化字段data与前端传入的字段request.data做对比进行校验
        user_serializer.is_valid(raise_exception=True)
        user = User(username=username, email=email, first_name=first_name)
        # 生成初始密码
        source = string.ascii_letters + string.digits #source生成为list
        password = ''.join(random.sample(source, 6)) #使用.join转换list为str
        user.set_password(password)  # 给用户设置密码，会进行加密，存储密文
        user.save()

        # 设置为学生身份
        group = Group.objects.get(id=2)
        group.user_set.add(user)
        # 添加班级
        classes.member.add(user)
        # 发送邮件
        # print(email, username, password, classes.name)
        send_email_task.delay(email, username, password, classes.name) #使用.delay调用异步
        #返回
        return Response(user_serializer.data,status=HTTP_201_CREATED)